/*
* Archivo de encabezamiento: contrato con el TAD Lista Lineal.
* simplemente encadenada, ordenada, sin repeticiones, con header.
* Utiliza shallow copy y sirve para tipos de datos genericos.
* No admite constantes.
* Obtenida de la catedra de Estructura de Datos y Algoritmos.
* Con modificaciones:
*              - se agrego la funcion GetDatoByComp
*              - correcciones generales
*/

#ifndef _LISTALINEAL_ORDENADA_CONHEADER_SINREP_H
#define _LISTALINEAL_ORDENADA_CONHEADER_SINREP_H

#include <stdlib.h>     /* para que reconozca al size_t */

/* Tipo de datos que manipula el TAD LISTA */
typedef void * listElementT;

/* Tipo que define al TAD LISTA */
typedef struct listCDT *listADT;

/* tipo que tiene que tener la funcion de comparacion del usuario */
typedef int (*cmpfnT) (listElementT, listElementT);
typedef void (*freefnT) (listElementT);

/*
* ========================================================
* Operaciones con las que se puede acceder al TAD
* ========================================================
*/


/*
* Crea una nueva lista.
* recibe un cmpfnT para comparar los elementos de la lista,
* y un size_t con el tama�o de cada elemento
* retorna:
*              una lista vacia.
*      en caso de error, aborta.
*/
listADT NewList( cmpfnT cmp, freefnT libera, size_t tam);

/*
* Inserta 'element' en 'list'.
* Es shallow copy.
*/
void Insert(listADT list, listElementT element);


/*
* Borra 'element' de 'list'.
* retorna:
*              1 si pudo borrarlo
*              0 si el elemento no existia
*
*/
int Delete(listADT list, listElementT element);

/*
* retorna:
*              1 si la lista esta vacia
*              0 si tiene por lo menos 1 elemento
*/
int ListIsEmpty(listADT list);


/*
* retorna:
*              1 si 'element' pertenece a 'list'
*              0 en caso contrario
*/
int ElementBelongsList(listADT list, listElementT element);


/*
* esta funcion es necesaria para recorrer todos los datos de la lista.
* debe ser llamada antes de la primera invocacion de GetDato
*/
void SetBegin(listADT list);

/*
* copia en 'element' el proximo elemento del recorrido de la lista.
* retorna:
*              1 si aun hay elementos en la lista
*              0 si se termino de recorrer la lista, en ese caso, no se copia
*                      nada en 'element'
*/
int GetDato(listADT list, listElementT element);


/* dado un element, lo busca en la lista, y lo retorna con toda su informacion,
* si no existe, retorna NULL.
* Devuelve una shallow copy
*/
listElementT GetDatoByComp(listADT list, listElementT element);


/*
* libera la lista, y todos los elementos que estan almacenados en ella.
*/
void FreeList(listADT list);



/*GetListCount devuelve la cantidad de elementos que hay en la lista.
*
*/
int GetListCount(listADT list);

#endif